package com.rw.engine.ip.anno;


import com.rw.engine.CommonLimit;
import com.rw.engine.ip.interceptor.DefaultIpFilterRule;
import com.rw.engine.ip.enumeration.FilterMode;
import com.rw.engine.ip.interceptor.IpFilterRule;
import com.rw.engine.ip.enumeration.MatchMode;
import org.springframework.core.annotation.AliasFor;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * IP限制器
 * 这个限制器可以限制意料之外的IP地址访问这个接口
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@CommonLimit
public @interface IpLimit {
    /**
     * 同ip()
     */
    String[] value() default "";

    /**
     * IP列表
     * 需要加入黑名单或白名单的IP列表
     */
    String[] ip() default "";

    /**
     * 过滤模式，白名单或者黑名单，默认为白名单
     */
    FilterMode filterMode() default FilterMode.WHITELIST;

    /**
     * 匹配模式，默认为通配符
     * 还可以使用正则表达式匹配
     * 注意，通配符匹配仅仅只支持IPv4格式
     */
    MatchMode matchMode() default MatchMode.WILDCARD;

    /**
     * IP过滤规则器
     */
    @AliasFor(annotation = CommonLimit.class, attribute = CommonLimit.FILTER_RULE)
    Class<? extends IpFilterRule>[] ipFilterRule() default DefaultIpFilterRule.class;
}
